// Copyright Epic Games, Inc. All Rights Reserved.

#include "LyraSettingValueDiscrete_MobileFPSType.h"

#include "Performance/LyraPerformanceSettings.h"
#include "Settings/LyraSettingsLocal.h"

#include UE_INLINE_GENERATED_CPP_BY_NAME(LyraSettingValueDiscrete_MobileFPSType)

#define LOCTEXT_NAMESPACE "LyraSettings"

/**
 * 构造函数
 */
ULyraSettingValueDiscrete_MobileFPSType::ULyraSettingValueDiscrete_MobileFPSType()
{
}

/**
 * 初始化时调用
 */
void ULyraSettingValueDiscrete_MobileFPSType::OnInitialized()
{
	Super::OnInitialized(); // 调用父类初始化方法

	const ULyraPlatformSpecificRenderingSettings* PlatformSettings = ULyraPlatformSpecificRenderingSettings::Get(); // 获取平台特定渲染设置
	const ULyraSettingsLocal* UserSettings = ULyraSettingsLocal::Get(); // 获取用户设置

	for (int32 TestLimit : PlatformSettings->MobileFrameRateLimits) // 遍历移动帧率限制
	{
		if (ULyraSettingsLocal::IsSupportedMobileFramePace(TestLimit)) // 检查是否支持移动帧率
		{
			FPSOptions.Add(TestLimit, MakeLimitString(TestLimit)); // 添加FPS选项
		}
	}

	const int32 FirstFrameRateWithQualityLimit = UserSettings->GetFirstFrameRateWithQualityLimit(); // 获取第一个有质量限制的帧率
	if (FirstFrameRateWithQualityLimit > 0) // 如果存在质量限制的帧率
	{
		SetWarningRichText(FText::Format(LOCTEXT("MobileFPSType_Note", "<strong>注意：将帧率设置更改为{0}或更高可能会降低您的质量预设。</>"), MakeLimitString(FirstFrameRateWithQualityLimit))); // 设置警告富文本
	}
}

/**
 * 获取默认FPS
 */
int32 ULyraSettingValueDiscrete_MobileFPSType::GetDefaultFPS() const
{
	return ULyraSettingsLocal::GetDefaultMobileFrameRate(); // 返回默认移动帧率
}

/**
 * 创建限制字符串
 */
FText ULyraSettingValueDiscrete_MobileFPSType::MakeLimitString(int32 Number)
{
	return FText::Format(LOCTEXT("MobileFrameRateOption", "{0} FPS"), FText::AsNumber(Number)); // 返回格式化FPS文本
}

/**
 * 存储初始设置
 */
void ULyraSettingValueDiscrete_MobileFPSType::StoreInitial()
{
	InitialValue = GetValue(); // 存储初始值
}

/**
 * 重置为默认值
 */
void ULyraSettingValueDiscrete_MobileFPSType::ResetToDefault()
{
	SetValue(GetDefaultFPS(), EGameSettingChangeReason::ResetToDefault); // 设置值为默认FPS
}

/**
 * 恢复到初始值
 */
void ULyraSettingValueDiscrete_MobileFPSType::RestoreToInitial()
{
	SetValue(InitialValue, EGameSettingChangeReason::RestoreToInitial); // 设置值为初始值
}

/**
 * 根据索引设置离散选项
 */
void ULyraSettingValueDiscrete_MobileFPSType::SetDiscreteOptionByIndex(int32 Index)
{
	TArray<int32> FPSOptionsModes; // FPS选项模式数组
	FPSOptions.GenerateKeyArray(FPSOptionsModes); // 生成FPS选项键数组

	int32 NewMode = FPSOptionsModes.IsValidIndex(Index) ? FPSOptionsModes[Index] : GetDefaultFPS(); // 获取新模式或默认FPS

	SetValue(NewMode, EGameSettingChangeReason::Change); // 设置值
}

/**
 * 获取离散选项索引
 */
int32 ULyraSettingValueDiscrete_MobileFPSType::GetDiscreteOptionIndex() const
{
	TArray<int32> FPSOptionsModes; // FPS选项模式数组
	FPSOptions.GenerateKeyArray(FPSOptionsModes); // 生成FPS选项键数组
	return FPSOptionsModes.IndexOfByKey(GetValue()); // 返回值的索引
}

/**
 * 获取离散选项
 */
TArray<FText> ULyraSettingValueDiscrete_MobileFPSType::GetDiscreteOptions() const
{
	TArray<FText> Options; // 选项数组
	FPSOptions.GenerateValueArray(Options); // 生成FPS选项值数组

	return Options; // 返回选项数组
}

/**
 * 获取值
 */
int32 ULyraSettingValueDiscrete_MobileFPSType::GetValue() const
{
	return ULyraSettingsLocal::Get()->GetDesiredMobileFrameRateLimit(); // 返回期望的移动帧率限制
}

/**
 * 设置值
 */
void ULyraSettingValueDiscrete_MobileFPSType::SetValue(int32 NewLimitFPS, EGameSettingChangeReason InReason)
{
	ULyraSettingsLocal::Get()->SetDesiredMobileFrameRateLimit(NewLimitFPS); // 设置期望的移动帧率限制

	NotifySettingChanged(InReason); // 通知设置已更改
}

#undef LOCTEXT_NAMESPACE